package vue;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.util.*;
import javax.swing.*;
import metier.*;
import utiles.FourmizLogger;

public class PanelCarte extends JPanel implements Observer {

    private Carte carte;
    private HashMap<String, JLabel> labels;

    public PanelCarte(Carte c) {
        super();

        // on enregistre la carte
        this.carte = c;
        this.carte.addObserver(this);

        // on met en place l'affichage
        this.setLayout(new GridLayout(this.carte.getLongueur(), this.carte.getLargeur()));
        this.labels = new HashMap<String, JLabel>();
        this.refreshAll();
    }

    private void refreshAll() {
        this.removeAll();

        for (int y = 0; y < carte.getLongueur(); y++) {
            for (int x = 0; x < carte.getLargeur(); x++) {
                ArrayList<Element> elements = this.carte.getElements(new Position(x, y));

                Color couleur = null;
                Color couleurFourmi = null;
                Position position = null;

                for (Element e : elements) {
                    if (position == null) {
                        position = this.carte.getPosition(e);
                    }

                    if (e instanceof Fourmi) {
                        couleurFourmi = e.getCouleur();
                    }

                    couleur = e.getCouleur();
                }

                if (couleurFourmi != null) {
                    couleur = couleurFourmi;
                }

                JLabel label = new JLabel("");
                /*{

                    private static final long serialVersionUID = 1L;

                    @Override
                    protected void paintComponent(Graphics g) {
                        g.setColor(getBackground());
                        g.fillRect(0, 0, getWidth(), getHeight());
                        super.paintComponent(g);
                    }
                };*/

                if (couleur != null) {
                    label.setOpaque(true);
                    label.setBackground(couleur);
                }

                this.add(label);
                if (position != null) {
                    this.labels.put(position.toString(), label);
                }
            }
        }
        this.revalidate();
    }

    public void refresh(Position positionElement) {
        if (positionElement != null) {
            int posx = positionElement.getX();
            int posy = positionElement.getY();

            //Traitement � adapter (ordre des for)
            for (int x = posx - 1; x <= posx + 1; x++) {
                for (int y = posy - 1; y <= posy + 1; y++) {
                    Position position = new Position(x, y);

                    Color couleur = null;
                    Color couleurFourmi = null;

                    for (Element element : this.carte.getElements(position)) {
                        if (element instanceof Fourmi && couleurFourmi == null) {
                            couleurFourmi = element.getCouleur();
                        }
                        
                        if (element instanceof Fourmiliere) {
                            couleurFourmi = element.getCouleur();
                        }

                        couleur = element.getCouleur();
                    }

                    if (couleurFourmi != null) {
                        couleur = couleurFourmi;
                    }

                    JLabel label = this.labels.get(position.toString());

                    if (couleur != null && label != null) {
						label.setOpaque(true);
						label.setBackground(Color.WHITE);
                        label.setBackground(couleur);
                        label.repaint();
						label.revalidate();
                    }
                }
            }
        }

        this.revalidate();
    }

    @Override
    public void update(Observable o, Object arg) {
		if (arg instanceof Element) {
			Position position = this.carte.getPosition((Element) arg);
		    this.refresh(position);
			
//			if (arg instanceof Fourmi) {
//				Fourmi fourmi = (Fourmi) arg;
//				Position ancetre = fourmi.getAncetrePos();
//				this.refresh(ancetre);
//			}
		} else if (arg instanceof Position) {
			this.refresh((Position) arg);
		}
//        this.refreshAll();
    }
}
